﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RFMS;

namespace BU
{
    public class OrderRegel
    {
        public int Aantal { get; set; }
        public int PrijsPerStuk { get; set; }

        private ModelRFMSContainer _container;
        public OrderRegel()
        {
            _container = ModelRFMSContainer.GetInstance();
        }

        public List<List<string>> LijstVanOrderRegels(string tafelNaam)
        {
            var orderRegels = from g in _container.OrderRegelSet
                              where g.Order.Tafels.Naam == tafelNaam &&g.Order.Afgehandeld == false
                              select g;
            var lijst = new List<List<string>>();

            foreach (var w in orderRegels)
            {
                lijst.Add(new List<string> { w.OrderRegelId.ToString(), w.Aantal.ToString(), w.PrijsPerStuk.ToString(), w.Artikel.Naam});
            }

            return lijst;
        }

        public List<List<string>> LijstVanOrderRegels(DateTime van, DateTime tot)
        {
            var lijst = new List<List<string>>();

            if (van != tot)
            {
                var order = from g in _container.OrderSet
                            where g.Datum >= van && g.Datum <= tot && g.Afgehandeld == true
                            select g;
                
                foreach (var o in order)
                {
                    foreach (var or in o.OrderRegel)
                    {
                        lijst.Add(new List<string> { o.Datum.ToShortDateString(), or.Aantal.ToString(), or.Artikel.Naam.ToString(), or.PrijsPerStuk.ToString(), or.Werknemer.Naam.ToString(), or.Artikel.BTW.ToString() });
                    }
                }
            }

            else
            {
                var order = from g in _container.OrderSet
                            where g.Datum == van
                            select g;

                foreach (var o in order)
                {
                    foreach (var or in o.OrderRegel)
                    {
                        lijst.Add(new List<string> { o.Datum.ToShortDateString(), or.Aantal.ToString(), or.Artikel.Naam.ToString(), or.PrijsPerStuk.ToString(), or.Werknemer.Naam.ToString(), or.Artikel.BTW.ToString() });
                    }
                }
            }

            return lijst;
        }

        public void OrderCorrigeren(int id, string naamTafel, string artikelNaam)
        {
            //var tafel = _container.OrderRegelSet.Single(p => p.Order.Tafels.Naam == naamTafel && p.OrderRegelId == id);
            var artikelid = _container.ArtikelSet.Single(p => p.Naam == artikelNaam && p.Actief == true);
            var orderRegel = _container.OrderRegelSet.Single(p => p.OrderRegelId == id);
            orderRegel.ArtikelReference.Value = artikelid;
            _container.SaveChanges();
        }

        public void OrderCorrigeren(int id, int aantal, string naamTafel)
        {
            //var tafel = _container.OrderRegelSet.Single(p => p.Order.Tafels.Naam == naamTafel && p.OrderRegelId == id);
            var orderRegel = _container.OrderRegelSet.Single(p => p.OrderRegelId == id);
            if (aantal != 0)
            {
                orderRegel.Aantal = aantal;
                _container.SaveChanges();
            }
        }

        public void OrderInboeken(int aantal, double prijsPerStuk, string artikelNaam, int orderId, string werknemerNaam)
        {
            RFMS.Artikel artikel = GetArtikel(artikelNaam);
            RFMS.Order order = GetOrder(orderId);
            RFMS.OrderRegel orderRegel = RFMS.OrderRegel.CreateOrderRegel(0, aantal, prijsPerStuk, true);
            RFMS.Werknemer werknemer = ZoekWerknemer(werknemerNaam);
            orderRegel.Werknemer = werknemer;
            order.OrderRegel.Add(orderRegel);
            artikel.OrderRegels.Add(orderRegel);
            
            _container.SaveChanges();
        }

        private RFMS.Werknemer ZoekWerknemer(string werknemerNaam)
        {
            var werknemer = _container.WerknemerSet.FirstOrDefault(p => p.Naam == werknemerNaam);
            return werknemer;
        }

        private RFMS.Artikel GetArtikel(string artikel)
        {
            RFMS.Artikel cat = new RFMS.Artikel();

            var test = from t in _container.ArtikelSet
                       where t.Naam == artikel
                       select t;
            foreach (var text in test)
            {
                cat = text;
            }
            return cat;
        }

        private RFMS.Order GetOrder(int order)
        {
            RFMS.Order cat = new RFMS.Order();

            var test = from t in _container.OrderSet
                       where t.OrderId == order
                       select t;
            foreach (var text in test)
            {
                cat = text;
            }
            return cat;
        }

        public List<List<string>> KlantBon(string tafelNaam)
        {
            var orderRegels = from g in _container.OrderRegelSet
                              where g.Order.Tafels.Naam == tafelNaam && g.Order.Afgehandeld == false
                              select g;
            var lijst = new List<List<string>>();

            foreach (var o in orderRegels)
            {
                lijst.Add(new List<string> { o.Aantal.ToString(), o.Artikel.Naam, o.PrijsPerStuk.ToString(), o.Artikel.BTW.ToString(), o.Order.OrderId.ToString(), o.Order.Datum.ToString()});
            }

            return lijst;
        }
    }
}
